package com.loklok.code.confuse.util;

import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Computable;
import com.intellij.psi.JavaPsiFacade;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiJavaFile;
import com.intellij.psi.search.GlobalSearchScope;
import org.apache.commons.io.FileUtils;
import org.jetbrains.annotations.Nullable;

import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

public class ClassContentLoader {

    /**
     * 根据 PsiClass 获取类的源码文本
     *
     * @param psiClass Psi类对象
     * @return 源码文本字符串
     */
    public static String getClassText(PsiClass psiClass) {
        if (psiClass == null) {
            return null;
        }

        PsiFile containingFile = psiClass.getContainingFile();
        if (!(containingFile instanceof PsiJavaFile)) {
            return null;
        }

        //  包裹在 readAction 中
        return ApplicationManager.getApplication().runReadAction((Computable<String>) containingFile::getText);
    }

    /**
     * 根据类名和项目获取类的源码文本
     *
     * @param project   当前项目
     * @param className 全限定类名
     * @return 源码文本字符串
     */
    @Nullable
    public static String getClassText(Project project, String className) {
        PsiClass psiClass = JavaPsiFacade.getInstance(project)
                .findClass(className, GlobalSearchScope.allScope(project));
        return getClassText(psiClass);
    }

    /**
     * 从文件系统中加载类的源码文本
     *
     * @param sourceFilePath 类的源文件路径（如：/path/to/MyClass.java）
     * @return 源码文本字符串
     */
    public static String getClassTextFromFile(String sourceFilePath) {
        try {
            File file = new File(sourceFilePath);
            if (file.exists()) {
                return FileUtils.readFileToString(file, StandardCharsets.UTF_8);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}
